package web.ctroller;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import pojo.User;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;

@Controller
@RequestMapping("/req")  //放在类上，定义当前控制器类中所有控制器方法的共性路径
public class RequestController {

    //放在控制器方法上，定义当前控制器方法的子路径，同时可以定义该控制器的请求方式
    @RequestMapping(value = "/test1",method = RequestMethod.GET)
    public String test1(){
        System.out.println("test1....");

        return "a";
    }

    /*
        http://localhost:80/req/test2?uname=zs&age=18&pwd=123

            @RequestParam: ① 定义接收参数的名称 ② 定义这个参数是否必须（默认是必须）
     */
    @RequestMapping(value = "/test2")
    public String test2(@RequestParam(value = "uname",required = false) String username,
                        @RequestParam("age") Integer age,
                        @RequestParam("pwd") String password){
        System.out.println("test2....");

        System.out.println("username:" + username);
        System.out.println("age:" + age);
        System.out.println("password:" + password);

        return "a";
    }

    /**
        @RequestParam 和 单纯对象的接收参数时，要求参数的格式必须是 key=value&key2=value2&....
     */
    @RequestMapping("/test3")
    public String test3(User user,@RequestParam("age") Integer age){
        System.out.println("test3...");
        System.out.println(user);
        System.out.println("age:" + age);
        return "a";
    }

    /*
        springmvc内部将String转换成Date类型时，默认的String格式为 yyyy/MM/dd
        如果前端传递的String格式不满足默认值，可以使用@DateTimeFormat重新定义格式
     */
    @RequestMapping("/test4")
    public String test4(User user, @RequestParam("age") Integer age,
                        @DateTimeFormat(pattern = "yyyy-MM-dd") Date bir){
        System.out.println("test4...");
        System.out.println(user);
        System.out.println("age:" + age);
        System.out.println("bir:" + bir);
        return "a";
    }

    // http://localhost:80/req/test5/zhangsan/findA/2
    @RequestMapping("/test5/{name}/findA/{id}")
    public String test5(@PathVariable("name") String name,
                        @PathVariable("id") Integer id){
        System.out.println("test5...");
        System.out.println("name:" + name);
        System.out.println("id:" + id);

        return "a";
    }

    /*
        @RequestHeader 获取指定名称的头
        @CookieValue 获取指定名称的cookie值
     */
    @RequestMapping("/test6")
    public String test6(@RequestHeader("Accept-Encoding") String acceptEncoding,
                        @RequestHeader("Cookie")String cookie,
                        @CookieValue("name") String nameCookie){
        System.out.println("test6..");

        System.out.println("Accept-Encoding:" + acceptEncoding);
        System.out.println("Cookie:" + cookie);
        System.out.println("nameCookie:" + nameCookie);
        return "a";
    }

    /*
        原生方式操作
     */
    @RequestMapping("/test7")
    public void test7(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req.getParameter("uname"));
        System.out.println(req.getParameter("age"));

        Cookie[] cookies = req.getCookies();
        System.out.println(Arrays.toString(cookies));

        System.out.println(req.getHeader("Accept-Encoding"));

        req.getRequestDispatcher("/WEB-INF/html/a.html").forward(req,resp);
    }


    /*
        @RequestBody： 表示前端传递过来的数据是在请求体中，并且数据的格式是一个JSON字符串格式
            需要利用JSON转换工具，帮助我们将SON字符串格式转成java中的对象
            springmvc中默认使用的JSON转换工具是Jackson --（注意：引入Jackson依赖）
     */

    @RequestMapping("/test8")
    public String test8(@RequestBody User user){
        System.out.println("test8..");
        System.out.println(user);
        return "a";
    }
}
